package com.project.biz.impl;

import com.project.biz.RedisBiz;
import com.project.common.enums.LoginEnum;
import com.project.redis.RedisClient1;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Description: 用户登录信息缓存接口实现类
 * @Author: zhuchi
 * @CreateDate: 2020/6/23 23:32
 * @Version: 1.0
 */
@Service
public class RedisBizImpl implements RedisBiz {

    /**
     * Redis服务
     */
    @Autowired
    private RedisClient1 redisClient1;

    /**
     * 缓存用户ID
     * @param userId
     * @return
     */
    public boolean setUserInfo(String token, Long userId){
        //获取用户之前登陆的TOKEN
        String oldToken = this.getTokenByUserId(userId);
        //删除之前的Token，实现单点登录
        if (StringUtils.isNotBlank(oldToken)){
            if (this.checkToken(oldToken)){
                this.redisClient1.del(LoginEnum.LOGIN_SESSION_KEY.Value() + oldToken);
            }
        }
        //用户ID为Key，Token为值
        this.redisClient1.set(LoginEnum.LOGIN_USERID_KEY.Value() + userId, token);

        //Token为Key，UserId为值
        boolean result =  this.redisClient1.set(LoginEnum.LOGIN_SESSION_KEY.Value() + token, String.valueOf(userId));
        redisClient1.expire(LoginEnum.LOGIN_SESSION_KEY.Value() + token, 60*60*24*3);//缓存三天
        return result;
    }

    /**
     * 根据Token获取用户信息
     * @param token
     * @return
     */
    public Long getUserInfo(String token){
        if (this.checkToken(token)){
            String userId =  this.redisClient1.get(LoginEnum.LOGIN_SESSION_KEY.Value() + token);
            return Long.parseLong(userId);
        }
        return null;
    }

    /**
     * 验证token是否存在
     * @param token
     * @return
     */
    public boolean checkToken(String token){
        return this.redisClient1.hasKey(LoginEnum.LOGIN_SESSION_KEY.Value() + token);
    }

    /**
     * 重置Token时间
     * @param token
     * @return
     */
    public boolean resetExpire(String token){
        if (this.checkToken(token)){
            boolean result = redisClient1.expire(LoginEnum.LOGIN_SESSION_KEY.Value() + token, 60*60*24*3);//缓存三天
            return result;
        }
        return false;
    }

    /**
     * 退出登录
     * @param token
     * @return
     */
    public boolean loginOut(String token){
        this.redisClient1.del(LoginEnum.LOGIN_SESSION_KEY.Value() + token);
        return true;
    }

    /**
     * 根据用户ID获取用户token
     * @param userId
     * @return
     */
    public String getTokenByUserId(Long userId){
        String token =  this.redisClient1.get(LoginEnum.LOGIN_USERID_KEY.Value() + userId);
        return token;
    }

    /**
     * 使某用户下线
     * @param userId
     */
    public void offlineUser(Long userId){
        //获取用户Token
        String token = this.getTokenByUserId(userId);
        //删除Token
        if (StringUtils.isNotBlank(token)){
            if (this.checkToken(token)){
                this.redisClient1.del(LoginEnum.LOGIN_SESSION_KEY.Value() + token);
            }
        }
    }

    /**
     * 验证码加入Redis
     * @param mobile
     * @param code
     */
    public void saveVerifyCode(String mobile, String code){
        this.redisClient1.set(LoginEnum.SEND_VERIFY_CODE.Value() + mobile, code);
        this.redisClient1.expire(LoginEnum.SEND_VERIFY_CODE.Value() + mobile, 60*3);//缓存3分钟
    }

    /**
     * 根据手机号获取验证码
     * @param mobile
     * @return
     */
    public String getVerifyCode(String mobile){
        if (this.redisClient1.hasKey(LoginEnum.SEND_VERIFY_CODE.Value() + mobile)){
            String code = this.redisClient1.get(LoginEnum.SEND_VERIFY_CODE.Value() + mobile);
            return code;
        }
        return null;
    }

    /**
     * 根据手机号删除缓存验证码
     * @param mobile
     * @return
     */
    public void delVerifyCode(String mobile){
        if (redisClient1.hasKey(LoginEnum.SEND_VERIFY_CODE.Value() + mobile)){
            this.redisClient1.del(LoginEnum.SEND_VERIFY_CODE.Value() + mobile);
        }
    }

    /**
     * 注册令牌对应的图形验证码放入缓存（有效时间30分钟）
     * @param registerKey
     * @param code
     * @return
     */
    public boolean setRegisterImgCode(String registerKey, String code){
        boolean result = this.redisClient1.set(LoginEnum.REGISTER_KEY.Value() + registerKey, code, 30*60);
        return result;
    }

    /**
     * 获取注册令牌对应的图形验证码
     * @param registerKey
     * @return
     */
    public String getRegisterImgCode(String registerKey){
        if (this.checkRegisterImgCode(registerKey)){
            return this.redisClient1.get(LoginEnum.REGISTER_KEY.Value() + registerKey);
        }
        return null;
    }

    /**
     * 验证注册令牌是否有效
     * @param registerKey
     * @return
     */
    public boolean checkRegisterImgCode(String registerKey){
        return this.redisClient1.hasKey(LoginEnum.REGISTER_KEY.Value() + registerKey);
    }

    /**
     * 删除注册令牌对应的图形验证码
     * @param registerKey
     */
    public void delRegisterImgCode(String registerKey){
        if (this.checkRegisterImgCode(registerKey)){
            this.redisClient1.del(LoginEnum.REGISTER_KEY.Value() + registerKey);
        }
    }

}
